package com.xuzimian.globaldemo.designpatterns.singleton;

/**
 * 双重锁判断模式：
 * DCL也就是双重锁判断机制（由于JVM底层模型原因，偶尔会出问题，不建议使用）.
 * 针对懒加载模式，在整个方法上加锁，该模式仅在判断instance实例为空时才加锁，判断为空
 * 加锁以后再次检查instance实例是否为null,主要是防止在第一次判断为null后，加锁前，已经
 * 有别的线程完成了instance实例的赋值。
 */
public class DoubleCheckLockSingleton {

    private DoubleCheckLockSingleton() {
        //创建单例的过程可能会比较慢
        System.out.println("LazySingleton is create");
    }

    private static DoubleCheckLockSingleton instance = null;

    public static DoubleCheckLockSingleton getInstance() {
        if (null == instance) {
            synchronized (DoubleCheckLockSingleton.class) {
                if (null == instance) {
                    instance = new DoubleCheckLockSingleton();
                }
            }
        }
        return instance;
    }
}
